package org.pictual.controller;

import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

import org.apache.log4j.Logger;
import org.pictual.business.dao.SequenceGeneratorDAO;
import org.pictual.business.dao.exceptions.DAOException;
import org.pictual.business.vo.DefinicionVO;
import org.pictual.business.vo.IdiomaVO;
import org.pictual.business.vo.PalabraVO;
import org.pictual.util.ClaveValor;
import org.pictual.util.GetAudio;
import org.pictual.util.GetPronun;

public class WikiTrataDatos {

	private boolean mismo_idioma;
	private static String palabra;
	private String cadena_wiki;
	private String idioma_wiki;
	private String idioma_palabra;
	
	private IdiomaVO idiomaVO;
	private DefinicionVO definicionVO;
	private PalabraVO palabraVO;
//	private ImagenVO[] imagenes = new ImagenVO[6];
	
//	private int palabra_id;
	private String genero;
	private String pronunciacion;
	private ClaveValor significado1;
	private ClaveValor significado2;
	private ClaveValor significado3;
	private String ejemplo1;
	private String ejemplo2;
	private String ejemplo3;
	private String audio;
	private String verbo;
	private boolean verb=false;
	private boolean sust=false;
	private boolean fem=false;
	private boolean masc=false;
	private boolean otro=false;
	private String inES;
	private String inEN;
	private String inFR;
	private String inDE;
	
	ArrayList<String> titulos1 = new ArrayList<String>();
	ArrayList<String> titulos2 = new ArrayList<String>();
	ArrayList<String> titulos3 = new ArrayList<String>();
	ArrayList<ClaveValor> significados = new ArrayList<ClaveValor>();
	ArrayList<String> significados2 = new ArrayList<String>();
	ArrayList<String> ejemplos = new ArrayList<String>();
	ArrayList<String> pronunciaciones = new ArrayList<String>();
	ArrayList<String> audios = new ArrayList<String>();
	ArrayList<String> idiomas = new ArrayList<String>();
	ArrayList<String> traducciones = new ArrayList<String>();
	
	String linea_idioma = null;
	String tope = null;
	boolean idioma_valido=false;
	SequenceGeneratorDAO sequenceGeneratorDAO;
	private String plural;
	private String codigo_audio;
	private boolean neutro;
	static String[] langz={"en", "es", "de", "fr"};
	protected static Logger log= Logger.getLogger(WikiTrataDatos.class);
	
	public WikiTrataDatos(String palabra, String cadena_wiki, String idioma_wiki, String idioma_palabra){
		this.palabra=palabra;
		this.cadena_wiki=cadena_wiki;
		this.idioma_wiki=idioma_wiki;
		this.idioma_palabra=idioma_palabra;
		this.mismo_idioma = idioma_palabra.equals(idioma_wiki);
		
		try{
			processData();
		}catch(Exception e){
			log.error("Error al procesar palabra", e);
		}
	}
	
	/**
	 * Proceso para obtener los VO de WIKI
	 */
	public void processData(){
		if(idioma_wiki.equals("es")){	//ESPAÑOL
			log.info("El idioma de la wiki es el español");
			processWikiES();	//Carga el proceso para las palabras de Wiki ES
		} else if(idioma_wiki.equals("en")){	//INGLÉS
			processWikiEN();	//Carga el proceso para las palabras de Wiki EN
			log.info("El idioma de la wiki es el inglés");
		} else if(idioma_wiki.equals("de")){	//ALEMÁN
			processWikiDE();
			log.info("El idioma de la wiki es el alemán");
		} else if(idioma_wiki.equals("fr")){	//FRANCÉS
			processWikiEN();
			log.info("El idioma de la wiki es el francés");
		} else{	//NO HAY IDIOMA
			log.error("No hay un idioma valido");
		}
	}
	
	
	
		//Definicion
		//	palabra, idioma_origen, idioma_destino, 3 definiciones, 3 ejemplos, 
		//	completo, auto_actualizado, visitas, contador_wiki, info_direccion
	
	
		//idioma
		//	palabra, idioma, nombre, visitas, contador_wiki, pronunciacion, 
		//	genero, plural, audio, verbo, sustantivo, otro, completo, autoactualizado, 
		//	equivalente_es, equivalente_en, equivalente_de, equivalente_fr, conjugacion_verbo, 
		//	fecha_completo, cod_audio
		
	/**
	 * Proceso Wiki ES
	 */
	public void processWikiES(){
		StringTokenizer tokens = new StringTokenizer(cadena_wiki, "\n");
		log.info("Dividido el texto de wiki en tokens por lineas");
		
		String linea = null;
		ClaveValor significado_definicion=new ClaveValor();
		boolean encontrado = false;
		boolean encontradoejemplo = false;
		while(tokens.hasMoreTokens()){
			linea=tokens.nextToken();
//			log.debug("Linea: "+linea);

			//Comprobación de idiomas
			if(linea.contains("{{")){

				//Recorro los idiomas, para comparar que empiece por uno de ellos, entonces encontrado un idioma, lo guardo. Y guardo true o false dependiendo si es el necesario
				
					
					if( linea.contains("{{ES-") || 
							linea.contains("{{ES|") || 
							(linea.contains("ES")) ){	//Las cadenas son: "{{EN-" o "{{ES|"
						
						String idioma = "";
						if(linea.contains("ES|")) idioma="es";
						if(linea.contains("EN-")) idioma="en";
						if(linea.contains("DE-")) idioma="de";
						if(linea.contains("FR-")) idioma="fr";
						
						if(idioma.equals(idioma_palabra)){	//Idioma valido
							idioma_valido=true;
//							log.debug("Encontrado un idioma valido: "+linea);
						} else{	//idioma no valido
							idioma_valido=false;
//							log.debug("Encontrado un idioma no valido: "+linea);
						}
						idiomas.add(linea);	//Añado los idiomas de la palabra (puede que se busquen luego en la wiki del idioma)
					}
				
			}
			
			if(encontradoejemplo){	//Si ya habia uno lo agrego a la colección
				significados.add(significado_definicion);
				significado_definicion=new ClaveValor();
				encontradoejemplo=true;
				encontrado=false;
			}

			//Llegado a este punto, el idioma es valido o no. Si es valido procedemos a obtener datos. Si no saltamos al siguiente token.
			if(idioma_valido){
				
				if(linea.contains("=")){	//Guardamos los titulos, (Hay tres niveles)
					if(linea.contains("==")){
						if(linea.contains("===")) titulos3.add(linea);
						else titulos2.add(linea);
					} else titulos1.add(linea);
					
				} else if(linea.startsWith(";")){	//significados
					if(encontrado){	//Si ya habia uno lo agrego a la colección
						significados.add(significado_definicion);
						significado_definicion=new ClaveValor();
						encontrado=false;
					}
					if(linea!=null)significado_definicion.setClave(linea);	//guardo la clave en el objeto
					encontrado=true;
				} else if(linea.startsWith("# ")){	//significados (parece que si no son en español, también puede empezar por # (sin numero))
					significados2.add(linea);
//					significado_definicion.setClave(linea);
//					encontrado=true;
				} else if( (linea.startsWith("::"))||
						(linea.startsWith(":*"))||
						(linea.startsWith(":**"))||
						(linea.startsWith("#:"))||
						(linea.toLowerCase().contains("ejemplo"))){	//Ejemplos
					linea=processEjemplo(linea);
//					if(linea!=null)ejemplos.add(linea);
					
					if(significado_definicion.getClave()!=null){	//Si habia una clave (Significado, le asigno un ejemplo)
						
						if((linea!=null)&&(!linea.isEmpty())){
							significado_definicion.setValor(linea);

							encontradoejemplo=true;
						}
					}
				} else if(linea.contains("pronun")){	//Pronunciación
					pronunciaciones.add(linea);
				} else if(linea.contains(".ogg")){	//Audio
					audios.add(linea);
				} else if( linea.contains("{{t+|") || linea.contains("n{{t+|") || linea.contains("\n{{t+|") ){
					traducciones.add(linea);
				}
			}
			
			//Si encontro un siginificado, lo guardo (aunque no tenga ejemplo)
		}
		
		if(encontrado||encontradoejemplo){	//Si habia uno encontrado sin uno lo agrego a la colección
			significados.add(significado_definicion);
		}

		//Imprimo por pantalla lo recuperado tal y como se obtuvo.
//		log.debug("titulos1:");
//		for(String s: titulos1){
//			log.debug(s);
//		}
//
//		log.debug("titulos2:");
//		for(String s: titulos2){
//			log.debug(s);
//		}
//
//		log.debug("titulos3:");
//		for(String s: titulos3){
//			log.debug(s);
//		}
		
//		log.debug("Significados:");
		//Auxiliares para rellenar los 3 significados:
			int n = 0;
			int n3 = 0;
			int n2 = 0;
			boolean hueco1=false;
			boolean hueco2=false;
			boolean hueco3=false;
		
			//Clave valor de significado y ejemplo
		try{
		
			for(ClaveValor s: significados){
//				log.debug("Significado: "+s.getClave());
//				log.debug("Ejemplo: "+s.getValor());
	
				
				//proceso el significado y separo el numero
				ClaveValor numero_significado = proccessSignificado((String)s.getClave());	//Guardo el clave-valor numero_significado obtenido de la clave del significado_definicion
				//Cojo el numero del significado actual
				n=(Integer)numero_significado.getClave();
				
	//			log.debug("-> Significado con id: "+n);
				
				if((n<=3)&&(n!=0)){	//Si no es 0, y tiene de numero 1, 2 ó 3. Es válido.
					
					//comprueblo los huecos, si hay hueco lo meto, si no obtengo su numero.
					if(significado1==null){
						hueco1=true;
					}//Si no hueco, el significado1, queda ocupado definitivamente.
					
					if(significado2==null){
						hueco2=true;
						if(n==2){
							significado2=numero_significado;
							ejemplo2=(String)s.getValor();
							hueco2=false;
						}//Si hay hueco, y el n es 2. Lo guardo temporalmente (Se sustituiria si encuentro un 1 luego)
					} else {
	//					n2=Integer.parseInt(significado2.substring(significado2.indexOf(";")+1, significado2.indexOf(":")));
						n2=(Integer)significado2.getClave();
					}
					
					if(significado3==null){
						hueco3=true;
						if(n==3){
							significado3=numero_significado;
							ejemplo3=(String)s.getValor();
							hueco3=false;
						}//Si hay hueco, y el n es 3. Lo guardo temporalmente (Se sustituiria si encuentro un 1 luego)
					} else {
	//					n3=Integer.parseInt(significado3.substring(significado3.indexOf(";")+1, significado3.indexOf(":")));
						n3=(Integer)significado3.getClave();
					}
					
					
					//Si encuentro un 1
					if(n==1){
						//Si hay hueco en el 1º lo guardo
						if(hueco1){
							significado1=numero_significado;
							ejemplo1=(String)s.getValor();
							hueco1=false;
						}else if(hueco2){	//Si no hay hueco en el 1º
							//Si hay hueco en el 2º
							significado2=numero_significado;
							ejemplo2=(String)s.getValor();
							hueco2=false;
						}else if(hueco3){	//Si no hay hueco en el 2º
							//Si hay hueco en el 3º
							significado3=numero_significado;
							ejemplo3=(String)s.getValor();
							hueco3=false;
						}else if(n3>n){		//Si no hay hueco en el 3º
							//Si el numero del 3º es mayor
							significado3=numero_significado;
							ejemplo3=(String)s.getValor();
							hueco3=false;
						}else if(n2>n){	//Si no lo es miro si lo es el 2º
							significado3=numero_significado;
							ejemplo3=(String)s.getValor();
							hueco3=false;
						}
					}
				}
			}
		}catch(Exception e){
			log.error("Error al procesar significados");
		}
		
		//Si no hay significados con ";" buscamos con #
		if(significados.isEmpty()){
			if(!significados2.isEmpty()){
				significado1=new ClaveValor(1, significados2.get(0));
				significado1=new ClaveValor(2, significados2.get(0));
				significado1=new ClaveValor(3, significados2.get(0));
			}
		}
		
		//Ejemplos
//		log.debug("Ejemplos: ");
//		for(String s: ejemplos){
//			log.debug(s);
//		}
//		//Si falta algun ejemplo, rellenamos con la coleccion de ejemplos
//		if(!ejemplos.isEmpty()){
//			for(String s: ejemplos){
//				if(ejemplo1==null) ejemplo1=processEjemplo(s);
//				else if(ejemplo2==null) ejemplo2=processEjemplo(s);
//				else if(ejemplo3==null) ejemplo3=processEjemplo(s);
//			}
//		}
		
		
		if(significado1!=null)log.info("Significado 1: "+significado1.getValor());
		if(significado2!=null)log.info("Significado 2: "+significado2.getValor());
		if(significado3!=null)log.info("Significado 3: "+significado3.getValor());
		log.info("Ejemplo 1: "+ejemplo1);
		log.info("Ejemplo 2: "+ejemplo2);
		log.info("Ejemplo 3: "+ejemplo3);

		
		//Audio
//		log.debug("Audios: ");
		for(String s: audios){
//			log.debug(s);
			if( s.contains("es") && !s.contains("lat") && !s.contains("am") ){	//Recorro los audios. Si hay uno en español sin ser "lat" o "am" lo guardo.
				audio=s;
				log.info("Encontrado buen audio");
			}
		}
		if( (audio==null) && !audios.isEmpty() ){	//Si no guardo ninguno pero hay audios. Cojo el primero encontrado.
			try{
				audio = audios.get(0);
				log.info("Audio cualquiera");
			}catch (Exception e) {
				audio=null;
			}
		}
		
		if(audio!=null){	//Si hay audio, lo recorto hasta quedarme con el nombre del archivo
			audio=audio.replace(":*{{audio|", "");
			audio=audio.substring(0, audio.indexOf(".ogg"));

			audio = audio.substring(0, 1).toUpperCase() + audio.substring(1, audio.length());
			log.info("Audio: "+audio);
			
			//Una vez obtenido el nombre lo busco para descargar el archivo
			
			//PROBLEMA	Sube al ftp corrupto
			WikiDescargaOGG ogg = new WikiDescargaOGG(audio);
			codigo_audio=ogg.processDownload();
		}
		
		
		
		//Pronunciacion
//		log.debug("Pronunciaciones: ");
		for(String s: pronunciaciones){
//			log.debug(s);
			if(s.contains("/")){
				pronunciacion=s;
			}
		}
		if( (pronunciacion==null)&&(!pronunciaciones.isEmpty()) ){
			try{
				pronunciacion = pronunciaciones.get(0);
			}catch (Exception e) {
				pronunciacion=null;
			}
		}
		
		if(pronunciacion!=null){
			log.info("Linea de pronunciacion: "+pronunciacion);
			if(pronunciacion.contains("|")){
				int inicio = pronunciacion.indexOf("|")+1;
				int fin = pronunciacion.indexOf("}");
				pronunciacion = pronunciacion.substring(inicio, fin);
			}
			
			log.info("Pronunciacion: "+pronunciacion);
		}

		//Identificacion de verbo, sustantivo u otro
		if(!titulos3.isEmpty()){
			String tipo_palabra=titulos3.get(0).toLowerCase();
		
			try{
				if(tipo_palabra.contains("verb")){	//Si es verbo
					verb=true;
					log.info("Es un verbo");
					verbo="re";	//Desde wiki español siempre lo pongo como regular
					
					
				} else if(tipo_palabra.contains("sust")){	//Si no es un verbo, si es un sustantivo
					sust=true;
					log.info("Es un sustantivo");
					if(tipo_palabra.contains("fem")){	//Si es femenino
						fem=true;
						log.info("Es femenino");
						if(mismo_idioma) genero="la";
						else if(idioma_palabra.equals("en")) genero=null;
						else if(idioma_palabra.equals("fr")) genero="la";
						else if(idioma_palabra.equals("de")) genero="die";
						
					} else if(tipo_palabra.contains("masc")){	//Si es masculino
						masc=true;
						log.info("Es masculino");
						if(mismo_idioma) genero="el";
						else if(idioma_palabra.equals("en")) genero=null;
						else if(idioma_palabra.equals("fr")) genero="le";
						else if(idioma_palabra.equals("de")) genero="der";
						
					} else if(idioma_palabra.equals("de")) genero="das";	//Es neutro
					
				} else{	//Si no es ni verbo, ni sustantivo
					otro=true;
					log.info("Es otro");
				}
				
			}catch (Exception e) {
				log.error("No se pudo identificar el tipo de palabra.");
			}
		}	//Fin de comprobacion de tipo_palabra
		
		//Plural
		if(mismo_idioma){	//español
			char[] vocales = {'a','e','i','o','u','A','E','I','0','U'};
			for(char vocal: vocales){
				if(palabra.charAt(palabra.length()-1)==vocal){
					plural=palabra+'s';
					break;
				}
			}
			if(plural==null) plural=palabra+"es";
		}
		log.info("Plural: "+plural);
		
//		log.info("Traducciones:");
		for(String s: traducciones){
//			log.info(s);
			if(s.contains("|es|")){
				inES=processTraduccion(s);
			} else if(s.contains("|en|")){
				inEN=processTraduccion(s);
			} else if(s.contains("|fr|")){
				inFR=processTraduccion(s);
			} else if(s.contains("|de|")){
				inDE=processTraduccion(s);
			}
		}
		
		if(idioma_palabra.equals("es")) inES=palabra;
		if(idioma_palabra.equals("en")) inEN=palabra;
		if(idioma_palabra.equals("fr")) inFR=palabra;
		if(idioma_palabra.equals("de")) inDE=palabra;
		
		try {
			fillVO();	//Rellena el VO
		} catch (NumberFormatException e) {
			log.error("NumberFormatException al rellenar el VO", e);
		} catch (DAOException e) {
			log.error("DAOException al rellenar el VO", e);
		}
	}
	
	/**
	 * Proceso Wiki EN
	 */
	public void processWikiEN(){
		StringTokenizer tokens = new StringTokenizer(cadena_wiki, "\n");
		log.info("Dividido el texto de wiki en tokens por lineas");
		
		String linea = null;
		ClaveValor significado_definicion=new ClaveValor();
		boolean encontrado = false;
		while(tokens.hasMoreTokens()){
			linea=tokens.nextToken();
//			log.debug("Linea: "+linea);

			//Comprobación de idiomas
			//== {{langue|fr}} ==
			//==English==
			
			if( (linea.contains("{{langue")) || ((linea.contains("=="))) ){
				if((!linea.contains("==="))&&(!linea.contains("===="))){
					idioma_valido=false;
				}
				//Recorro los idiomas, para comparar que empiece por uno de ellos, entonces encontrado un idioma, lo guardo. Y guardo true o false dependiendo si es el necesario
					
					if( linea.toLowerCase().contains("== {{langue")
							|| linea.contains("==Spanish==")
							|| linea.contains("==English==")
							|| linea.contains("==German==")
							|| linea.contains("==French==")
							){
						
						
						if( 
							((linea.contains("==Spanish=="))&&(idioma_palabra.equals("es"))) ||
							((linea.contains("==English=="))&&(idioma_palabra.equals("en"))) ||
							((linea.contains("==German=="))&&(idioma_palabra.equals("de"))) ||
							((linea.contains("==French=="))&&(idioma_palabra.equals("fr"))) ||
							
							((linea.contains("== {{langue|es}} =="))&&(idioma_palabra.equals("es"))) ||
							((linea.contains("== {{langue|en}} =="))&&(idioma_palabra.equals("en"))) ||
							((linea.contains("== {{langue|de}} =="))&&(idioma_palabra.equals("de"))) ||
							((linea.contains("== {{langue|fr}} =="))&&(idioma_palabra.equals("fr")))
						
						
						) idioma_valido=true;
						
						
						else idioma_valido=false;
						
						if(idioma_valido){
//							log.debug("Encontrado un idioma "+idioma_palabra+" valido: "+linea);
						}
						else{
//							log.debug("Encontrado un idioma "+idioma_palabra+" no valido: "+linea);
						}
						
						idiomas.add(linea);	//Añado los idiomas de la palabra (puede que se busquen luego en la wiki del idioma)
					}
			}

			//Llegado a este punto, el idioma es valido o no. Si es valido procedemos a obtener datos. Si no saltamos al siguiente token.
			if(idioma_valido){
//				log.debug("Linea: "+linea);
				if( (linea.contains("===")) || (linea.contains("====")) || (linea.contains("-nom-")) || (linea.contains("-adj-")) || (linea.contains("-verb-"))  || linea.contains("{{") ){
					titulos3.add(linea);
				}
//				boolean add=false;
				if(linea.contains("=")){	//Guardamos los titulos, (Hay tres niveles)
					if(linea.contains("==")) titulos2.add(linea);
					else titulos1.add(linea);
					
				} else if(linea.contains("#")){	//significados o ejemplos
					encontrado=false;
					if( (linea.contains("#."))||(linea.contains("#:"))||(linea.contains("#*")) ){	//Si es un ejemplo
						if( (significado_definicion.getClave()!=null)&&(significado_definicion.getValor()==null) ){ //Hay significado y no hay valor
							significado_definicion.setValor(linea); //Guardo el ejemplo
							significados.add(significado_definicion);
							significado_definicion=new ClaveValor();
//							add=true;
						}
					}else{	//Si es un significado
						//Si no hay clave entonces es uno nuevo  y aun esperamos ejemplo
						if(significado_definicion.getClave()==null){
							significado_definicion.setClave(linea);
							encontrado=true;
						}
						else{	//Si ya habia clave entonces añadimos ese, tenga o no ejemplo y creamos uno nuevo
							significados.add(significado_definicion);
							significado_definicion=new ClaveValor();
//							add=true;
							significado_definicion.setClave(linea);
							encontrado=true;
						}
//						log.debug("fdfdf:"+ significado_definicion.getClave());
					}
					
				} else if(linea.contains("pron")){	//Pronunciación
					pronunciaciones.add(linea);
				} else if(linea.contains(".ogg")){	//Audio
					audios.add(linea);
				} else if( linea.contains("{{t+|") || linea.contains("n{{t+|") || linea.contains("\n{{t+|") ){
					traducciones.add(linea);
				}
				
				if((!masc)&&(!fem)&&(!neutro)){
					//genero
					if((linea.contains("fem"))||(linea.contains("{{f}}")||(linea.contains("|g=f|")||(linea.contains("|f}"))))){	//Si es femenino
						fem=true;
						log.info("Es femenino");
						if(idioma_palabra.equals("en")) genero=null;
						if(idioma_palabra.equals("fr")) genero="la";
						if(idioma_palabra.equals("de")) genero="die";
						if(idioma_palabra.equals("es")) genero="la";
						
					} else if((linea.contains("masc"))||(linea.contains("{{m}}")||(linea.contains("|g=m|")||(linea.contains("|m}"))))){	//Si es masculino
						masc=true;
						log.info("Es masculino");
						if(idioma_palabra.equals("en")) genero=null;
						if(idioma_palabra.equals("fr")) genero="le";
						if(idioma_palabra.equals("de")) genero="der";
						if(idioma_palabra.equals("es")) genero="el";
						
					} else if(linea.contains("|g=n|")){
						genero="das";	//Es neutro
						neutro=true;
					}
				}
				
//				if((!verb)&&(!sust)){
//					if(linea.contains("verb")){	//Si es verbo
//						verb=true;
//						log.info("Es un verbo");
//						verbo="re";	//Desde wiki español siempre lo pongo como regular
//						otro=false;
//						
//					} else if((linea.contains("sust"))||(linea.contains("nom"))||(linea.contains("noun"))){	//Si no es un verbo, si es un sustantivo
//						sust=true;
//						log.info("Es un sustantivo");
//						otro=false;
//					}
//				}
				
				if(linea.contains("{{de-noun")) titulos3.add(linea);
				if(linea.contains("{{fr-noun|")) titulos3.add(linea);
				
				

			}
			
		}
		

		if(encontrado)significados.add(significado_definicion);
		

		//Imprimo por pantalla lo recuperado tal y como se obtuvo.
//		log.debug("titulos1:");
//		for(String s: titulos1){
//			log.debug(s);
//		}

//		log.debug("titulos2:");
//		for(String s: titulos2){
//			log.debug(s);
//		}

//		log.debug("titulos3:");
//		for(String s: titulos3){
//			log.debug(s);
//		}
		
//		log.debug("Significados:" +significados.size());
		
			//Clave valor de significado y ejemplo
//		for(ClaveValor s: significados){
//			log.debug("Significado: "+s.getClave());
//			log.debug("Ejemplo: "+s.getValor());
//
//		}
		if(!significados.isEmpty()){
			
			if(significados.size()>0){
				if(significados.get(0)!=null){
					significado1 = significados.get(0);
					significado1.setClave(proccessSignificadoSimple((String) significado1.getClave()));
					if(significado1.getValor()!=null)significado1.setValor(processEjemplo((String) significado1.getValor()));
				}
				
				if(significados.size()>1){
					if(significados.get(1)!=null){
						significado2 = significados.get(1);
						significado2.setClave(proccessSignificadoSimple((String) significado2.getClave()));
						if(significado2.getValor()!=null)significado2.setValor(processEjemplo((String) significado2.getValor()));
					}
					
					if(significados.size()>2){
						if(significados.get(2)!=null){
							significado3 = significados.get(2);
							significado3.setClave(proccessSignificadoSimple((String) significado3.getClave()));
							if(significado3.getValor()!=null)significado3.setValor(processEjemplo((String) significado3.getValor()));
						}
					}
					
				}
				
			}
			
			
			
//			if(significado1!=null)log.info("Significado 1: "+significado1.getClave());
//			if((significado2!=null)&&(significado2!=null))log.info("Significado 2: "+significado2.getClave());
//			if(significado3!=null)log.info("Significado 3: "+significado3.getClave());
//			if(significado1!=null)log.info("Ejemplo 1: "+significado1.getValor());
//			if(significado2!=null)log.info("Ejemplo 2: "+significado2.getValor());
//			if(significado3!=null)log.info("Ejemplo 3: "+significado3.getValor());

		}
		//Audio
//		log.debug("Audios: ");
		for(String s: audios){
//			log.debug(s);
			if( s.contains("en")){	//Recorro los audios.
				audio=s;
				log.info("Encontrado buen audio");
			}
		}
		if( (audio==null) && !audios.isEmpty() ){	//Si no guardo ninguno pero hay audios. Cojo el primero encontrado.
			try{
				audio = audios.get(0);
				log.info("Audio cualquiera");
			}catch (Exception e) {
				audio=null;
			}
		}
		
		if(audio!=null){	//Si hay audio, lo recorto hasta quedarme con el nombre del archivo
			audio=audio.replace(":*{{audio|", "");
			audio=audio.substring(0, audio.indexOf(".ogg"));

			audio = audio.substring(0, 1).toUpperCase() + audio.substring(1, audio.length());
			log.info("Audio: "+audio);
			
			//Una vez obtenido el nombre lo busco para descargar el archivo
			WikiDescargaOGG ogg = new WikiDescargaOGG(audio);
			codigo_audio=ogg.processDownload();
			
		}
		
		//Pronunciacion
//		log.debug("Pronunciaciones: ");
		for(String s: pronunciaciones){
//			log.debug(s);
			if(s.contains("/")){
				pronunciacion=s;
			}
		}
		if( (pronunciacion==null)&&(!pronunciaciones.isEmpty()) ){
			try{
				pronunciacion = pronunciaciones.get(0);
			}catch (Exception e) {
				pronunciacion=null;
			}
		}
		
		if(pronunciacion!=null){
	//		log.info("Linea de pronunciacion: "+pronunciacion);
			if(pronunciacion.contains("|")){
				int inicio = pronunciacion.indexOf("|")+1;
				int fin = pronunciacion.indexOf("}");
				try{
					pronunciacion = pronunciacion.substring(inicio, fin);
				}catch (Exception e) {
					pronunciacion=null;
				}
			}
			
			log.info("Pronunciacion: "+pronunciacion);
		}
		
				

		//Identificacion de verbo, sustantivo u otro
		if(!titulos3.isEmpty()){
			for(String tipo_palabra: titulos3){
				try{
					if(tipo_palabra.toLowerCase().contains("verb")){	//Si es verbo
						verb=true;
						log.info("Es un verbo");
						verbo="re";	//Desde wiki español siempre lo pongo como regular
						
						
					} else if((tipo_palabra.toLowerCase().contains("sust"))||(tipo_palabra.toLowerCase().contains("nom"))||(tipo_palabra.toLowerCase().contains("noun"))){	//Si no es un verbo, si es un sustantivo
						sust=true;
						log.info("Es un sustantivo");
					}
				if(verb||sust) break;
				}catch (Exception e) {
					log.error("No se pudo identificar el tipo de palabra.");
				}
			}
		}	
			
		if(!verb&&!sust){
			otro=true;
			log.info("Es otro");
		}
		//Fin de comprobacion de tipo_palabra
		
		//Plural
		if(mismo_idioma){	//español
			char[] vocales = {'a','e','i','o','u','A','E','I','0','U'};
			for(char vocal: vocales){
				if(palabra.charAt(palabra.length()-1)==vocal){
					plural=palabra+'s';
					break;
				}
			}
			if(plural==null) plural=palabra+"es";
		}
		log.info("Plural: "+plural);
		
//		log.info("Traducciones:");
		for(String s: traducciones){
//			log.info(s);
			if(s.contains("|es|")){
				inES=processTraduccion(s);
			} else if(s.contains("|en|")){
				inEN=processTraduccion(s);
			} else if(s.contains("|fr|")){
				inFR=processTraduccion(s);
			} else if(s.contains("|de|")){
				inDE=processTraduccion(s);
			}
		}
		
		if(idioma_palabra.equals("es")) inES=palabra;
		if(idioma_palabra.equals("en")) inEN=palabra;
		if(idioma_palabra.equals("fr")) inFR=palabra;
		if(idioma_palabra.equals("de")) inDE=palabra;
		
		try {
			fillVO();	//Rellena el VO
		} catch (NumberFormatException e) {
			log.error("NumberFormatException al rellenar el VO", e);
		} catch (DAOException e) {
			log.error("DAOException al rellenar el VO", e);
		}
	}
	
	/**
	 * Proceso Wiki DE
	 */
	public void processWikiDE(){
		StringTokenizer tokens = new StringTokenizer(cadena_wiki, "\n");
		log.info("Dividido el texto de wiki en tokens por lineas");
		
		String linea = null;
		boolean significados=false;
		boolean ejemplos=false;
		int n=0;
		String numero;
		int i=1, j=1;
		
		significado1 = new ClaveValor();
		significado2 = new ClaveValor();
		significado3 = new ClaveValor();
		
		while(tokens.hasMoreTokens()){


//			== hola ({{Sprache|Spanisch}}) ==
//					=== {{Wortart|Grußformel|Spanisch}} ===
			
//					== Auto ({{Sprache|Deutsch}}) ==
//			=== {{Wortart|Substantiv|Deutsch}}, {{n}} ===
			
//			== hello ({{Sprache|Englisch}}) ==
//					=== {{Wortart|Interjektion|Englisch}} ===
			
//			== bonjour ({{Sprache|Französisch}}) ==
//					=== {{Wortart|Interjektion|Französisch}} ===
			
			linea=tokens.nextToken();
			
			if(linea.contains("==")){

				//Recorro los idiomas, para comparar que empiece por uno de ellos, entonces encontrado un idioma, lo guardo. Y guardo true o false dependiendo si es el necesario
					
					if( linea.contains("Spanisch")
							|| linea.contains("Deutsch")
							|| linea.contains("Englisch")
							|| linea.contains("Französisch")){
						
						if( ((linea.contains("Spanisch"))&&(idioma_palabra.equals("es"))) ||
						((linea.contains("Englisch"))&&(idioma_palabra.equals("en"))) ||
						((linea.contains("Deutsch"))&&(idioma_palabra.equals("de"))) ||
						((linea.contains("Französisch"))&&(idioma_palabra.equals("fr")))) idioma_valido=true;
						else idioma_valido=false;
						
						if(idioma_valido){
//							log.debug("Encontrado un idioma "+idioma_palabra+" valido: "+linea);
						}
						else{
//							log.debug("Encontrado un idioma "+idioma_palabra+" no valido: "+linea);
						}
						
						idiomas.add(linea);	//Añado los idiomas de la palabra (puede que se busquen luego en la wiki del idioma)
					}else idioma_valido=false;
			}

			//Llegado a este punto, el idioma es valido o no. Si es valido procedemos a obtener datos. Si no saltamos al siguiente token.
			if(idioma_valido){

//				log.info(linea);
				
				if( (linea.contains("===")) || (linea.contains("====")) ){
					titulos3.add(linea);
				}
//				boolean add=false;
				if(linea.contains("=")){	//Guardamos los titulos, (Hay tres niveles)
					if(linea.contains("==")) titulos2.add(linea);
					else titulos1.add(linea);
				}
				if(linea.contains("{{")){
					significados=false;
					ejemplos=false;
				}
				if(linea.contains("{{Bedeutungen}}")) significados=true;
				if(linea.contains("{{Beispiele}}")) ejemplos=true;
				if(significados){
					if( (linea.contains(":["))&&(i<=3) ){
						numero=linea.substring(linea.indexOf("[")+1, linea.indexOf("]"));
						n=Integer.parseInt(numero);
//						log.debug(numero);
						switch (n) {
						case 1:
							significado1.setClave(proccessSignificadoSimple(linea));
							break;
						case 2:
							significado2.setClave(proccessSignificadoSimple(linea));
							break;
						case 3:
							significado3.setClave(proccessSignificadoSimple(linea));
							break;

						default:
							break;
						}
						i++;
					}
				}
				if(ejemplos){
					if( (linea.contains(":["))&&(j<=3) ){
						numero=linea.substring(linea.indexOf("[")+1, linea.indexOf("]"));
						n=Integer.parseInt(numero);
//						log.debug(numero);
						switch (n) {
						case 1:
							significado1.setValor(proccessSignificadoSimple(linea));
							break;
						case 2:
							significado2.setValor(proccessSignificadoSimple(linea));
							break;
						case 3:
							significado3.setValor(proccessSignificadoSimple(linea));
							break;

						default:
							break;
						}
						j++;
					}
				}
			}
		}
		
		//Imprimo por pantalla lo recuperado tal y como se obtuvo.
//				log.debug("titulos1:");
//				for(String s: titulos1){
//					log.debug(s);
//				}
//
//				log.debug("titulos2:");
//				for(String s: titulos2){
//					log.debug(s);
//				}
//
//				log.debug("titulos3:");
//				for(String s: titulos3){
//					log.debug(s);
//				}
				
		log.info("Significado 1: "+significado1.getClave());
		log.info("Significado 2: "+significado2.getClave());
		log.info("Significado 3: "+significado3.getClave());
		log.info("Ejemplo 1: "+significado1.getValor());
		log.info("Ejemplo 2: "+significado2.getValor());
		log.info("Ejemplo 3: "+significado3.getValor());
			
//		log.debug(cadena_wiki.substring(cadena_wiki.indexOf("{{Bedeutungen}}")));
		
		
		//Audio
//				log.debug("Audios: ");
				for(String s: audios){
//					log.debug(s);
					if( s.contains("en")){	//Recorro los audios.
						audio=s;
						log.info("Encontrado buen audio");
					}
				}
				if( (audio==null) && !audios.isEmpty() ){	//Si no guardo ninguno pero hay audios. Cojo el primero encontrado.
					try{
						audio = audios.get(0);
						log.info("Audio cualquiera");
					}catch (Exception e) {
						audio=null;
					}
				}
				
				if(audio!=null){	//Si hay audio, lo recorto hasta quedarme con el nombre del archivo
					audio=audio.replace(":*{{audio|", "");
					audio=audio.substring(0, audio.indexOf(".ogg"));

					audio = audio.substring(0, 1).toUpperCase() + audio.substring(1, audio.length());
					log.info("Audio: "+audio);
					
					//Una vez obtenido el nombre lo busco para descargar el archivo
					WikiDescargaOGG ogg = new WikiDescargaOGG(audio);
					codigo_audio=ogg.processDownload();
					
				}
				
				
				
				//Pronunciacion
//				log.debug("Pronunciaciones: ");
				for(String s: pronunciaciones){
//					log.debug(s);
					if(s.contains("/")){
						pronunciacion=s;
					}
				}
				if( (pronunciacion==null)&&(!pronunciaciones.isEmpty()) ){
					try{
						pronunciacion = pronunciaciones.get(0);
					}catch (Exception e) {
						pronunciacion=null;
					}
				}
				
				if(pronunciacion!=null){
			//		log.info("Linea de pronunciacion: "+pronunciacion);
					if(pronunciacion.contains("|")){
						int inicio = pronunciacion.indexOf("|")+1;
						int fin = pronunciacion.indexOf("}");
						pronunciacion = pronunciacion.substring(inicio, fin);
					}
					
					log.info("Pronunciacion: "+pronunciacion);
				}

				//Identificacion de verbo, sustantivo u otro
				if(!titulos3.isEmpty()){
					String tipo_palabra=titulos3.get(0);
				
					try{
						if(tipo_palabra.contains("Verb")){	//Si es verbo
							verb=true;
							log.info("Es un verbo");
							verbo="true";
							
						} else if(tipo_palabra.contains("Substantiv")){	//Si no es un verbo, si es un sustantivo
							sust=true;
							log.info("Es un sustantivo");
							if(tipo_palabra.contains("{{f}}")){	//Si es femenino
								fem=true;
								log.info("Es femenino");
								if(idioma_palabra.equals("es")) genero="la";
								if(idioma_palabra.equals("en")) genero=null;
								if(idioma_palabra.equals("fr")) genero="la";
								if(idioma_palabra.equals("de")) genero="die";
								
							} else if(tipo_palabra.contains("{{m}}")){	//Si es masculino
								masc=true;
								log.info("Es masculino");
								if(idioma_palabra.equals("es")) genero="el";
								if(idioma_palabra.equals("en")) genero=null;
								if(idioma_palabra.equals("fr")) genero="le";
								if(idioma_palabra.equals("de")) genero="der";
								
							} else if(tipo_palabra.contains("{{n}}")){
								genero="das";	//Es neutro
								neutro=true;
								log.info("Es neutro");
							}
							
						} else{	//Si no es ni verbo, ni sustantivo
							otro=true;
							log.info("Es otro");
						}
						
					}catch (Exception e) {
						log.error("No se pudo identificar el tipo de palabra.");
					}
				}	//Fin de comprobacion de tipo_palabra
				
				//Plural
				if(mismo_idioma){	//español
					char[] vocales = {'a','e','i','o','u','A','E','I','0','U'};
					for(char vocal: vocales){
						if(palabra.charAt(palabra.length()-1)==vocal){
							plural=palabra+'s';
							break;
						}
					}
					if(plural==null) plural=palabra+"es";
				}
				log.info("Plural: "+plural);
				
//				log.info("Traducciones:");
				for(String s: traducciones){
//					log.info(s);
					if(s.contains("|es|")){
						inES=processTraduccion(s);
					} else if(s.contains("|en|")){
						inEN=processTraduccion(s);
					} else if(s.contains("|fr|")){
						inFR=processTraduccion(s);
					} else if(s.contains("|de|")){
						inDE=processTraduccion(s);
					}
				}
				
				if(idioma_palabra.equals("es")) inES=palabra;
				if(idioma_palabra.equals("en")) inEN=palabra;
				if(idioma_palabra.equals("fr")) inFR=palabra;
				if(idioma_palabra.equals("de")) inDE=palabra;
				
				try {
					fillVO();	//Rellena el VO
				} catch (NumberFormatException e) {
					log.error("NumberFormatException al rellenar el VO", e);
				} catch (DAOException e) {
					log.error("DAOException al rellenar el VO", e);
				}
	}
	
	public String processTraduccion(String linea){
		
		linea=linea.replace("\n{{t+", "");
		linea=linea.replace("n{{t+", "");
		linea=linea.replace("{{t+", "");
		linea=linea.replace("|es|", "");
		linea=linea.replace("|en|", "");
		linea=linea.replace("|de|", "");
		linea=linea.replace("|fr|", "");
		linea=linea.replace("?|", "");
		linea=linea.replace("1|", "");
		linea=linea.replace("#", "");
		linea=linea.replace("\"", "");
		linea=linea.replace("*", "");
		linea=linea.replace("'", "");
		linea=linea.replace(":", "");
		linea=linea.replace("[", "");
		linea=linea.replace("]", "");
		linea=linea.replace("{", "");
		linea=linea.replace("}", "");
		linea=linea.replace("ã¡", "á");
		linea=linea.replace("ã©", "é");
		linea=linea.replace("ã­", "í");
		linea=linea.replace("ã³", "ó");
		linea=linea.replace("ãº", "ú");
		linea=linea.replace("ã±", "ñ");
		
		if(linea.contains("|")) linea=linea.substring(0, linea.indexOf("|"));
		log.info("Traducción: "+ linea);
		return linea.trim();
	}
	
	public static String processEjemplo(String linea){
		// le paso una linea de significado y me devuelve una cadena de significado valida
		if(linea.equals(":*'''ejemplo''':")) return null;
		
		List<String> eliminar = new ArrayList<String>();
//		
//		if(idioma_wiki.equals("fr")){
//			eliminar.add( linea.substring(linea.indexOf("[?]")+1) ) ;
//			eliminar.add( linea.substring((linea.indexOf("{")+1), (linea.indexOf("}")+1)) );
//			
//			
		String aux=linea.substring(linea.indexOf(".")+1);
		log.debug("eliminar: "+aux);
		if(!aux.equals(" ")) eliminar.add(aux);
		eliminar.add("<b>");
		eliminar.add("</b>");
		for(String e: eliminar){
				linea=linea.replace(e, "");
		}
		
		
		linea=linea.replace(":*'''Ejemplo:''", "");
		linea=linea.replace(":*'''Ejemplo'':", "");
		linea=linea.replace("#", "");
		linea=linea.replace("\"", "");
		linea=linea.replace("*", "");
		linea=linea.replace("'", "");
		linea=linea.replace(":", "");
		linea=linea.replace("[", "");
		linea=linea.replace("]", "");
		linea=linea.replace("{", "");
		linea=linea.replace("}", "");
		linea=linea.replace("|", "");
		linea=linea.replace("'", "");
		linea=linea.replace(":1", "");
		linea=linea.replace(":2", "");
		linea=linea.replace(":3", "");
		linea=linea.replace(":", "");
//		linea=linea.replace("ã¡", "á");
//		linea=linea.replace("ã©", "é");
//		linea=linea.replace("ã­", "í");
//		linea=linea.replace("ã³", "ó");
//		linea=linea.replace("ãº", "ú");
//		linea=linea.replace("ã±", "ñ");
//		linea=linea.replace("ã¡", "á");
//		linea=linea.replace("ã©", "é");
//		linea=linea.replace("ã­", "í");
//		linea=linea.replace("ã³", "ó");
//		linea=linea.replace("ãº", "ú");
//		linea=linea.replace("ã±", "ñ");
		
		
		if(linea.contains("|")){
			linea=linea.substring(linea.indexOf("|")+1);
		}
		
		linea=linea.replace("ucf", palabra);
//		log.debug("Ejemplo tratado: "+linea);
		return linea.trim();
	}
	
	public static ClaveValor proccessSignificado(String linea){
		log.info("Se trata el significado: "+linea);
		try{
			//le paso una linea de significado y me devuelve una cadena de significado valida
			
			StringTokenizer tokens = new StringTokenizer(linea, " ");
			StringBuilder frase = new StringBuilder();
			log.info("Dividida la linea de significado en tokens por palabras");
			
			String p = null;
			Integer numero = null;
			boolean agregar=true;
			while(tokens.hasMoreTokens()){
				p=tokens.nextToken();
//				log.debug("Palabra: "+palabra);
				agregar=true;
				if(p.startsWith(";")){
					try{
						if(p.contains(":")){
							numero=Integer.parseInt(p.substring(p.indexOf(";")+1, p.indexOf(":")));
						}else{
							numero=Integer.parseInt(p.substring(p.indexOf(";")+1));
						}
					}catch (NumberFormatException e) {
						log.error("Error al obtener el numero del significado");
					}
					agregar=false;
				}else{
					p=p.replace("[", "");
					p=p.replace("]", "");
					p=p.replace("{", "");
					p=p.replace("}", "");
//					p=p.replace("ã¡", "á");
//					p=p.replace("ã©", "é");
//					p=p.replace("ã­", "í");
//					p=p.replace("ã³", "ó");
//					p=p.replace("ãº", "ú");
//					p=p.replace("ã±", "ñ");;
					
					if(p.contains("|")){
						p=p.substring(p.indexOf("|")+1);
					}
					
					p=p.replace("ucf", palabra);
				}
				
				if(agregar){
					frase.append(p+" ");
//					log.debug("Palabra tratada: "+palabra);
				}
				
			}
//			frase= new StringBuilder(frase.toString().replace(frase.toString().substring(0,1), frase.toString().substring(0,1).toUpperCase()));
			
			ClaveValor cv = new ClaveValor(numero, frase.toString().trim());
//			log.info(frase);
			return cv;
		}catch(Exception e){
			log.error("Error al processar el significado", e);
		}
		return null;
	}
	
	public String proccessSignificadoSimple(String linea){
		//le paso una linea de significado y me devuelve una cadena de significado valida

		StringTokenizer tokens = new StringTokenizer(linea, " ");
		StringBuilder frase = new StringBuilder();

		StringBuilder cadena = null;
		log.info("Dividida la linea de significado en tokens por palabras");

		String p = null;
		boolean agregar=true;
		while(tokens.hasMoreTokens()){
			p=tokens.nextToken();
//			log.debug("Palabra: "+p);
			agregar=true;
		
				p=p.replace("lang=es", "");
				p=p.replace("lang=en", "");
				p=p.replace("lang=de", "");
				p=p.replace("lang=fr", "");
				p=p.replace("#", "");
				p=p.replace("[", "");
				p=p.replace("]", "");
				p=p.replace("{", "");
				p=p.replace("}", "");
				p=p.replace("'", "");
				p=p.replace(":1", "");
				p=p.replace(":2", "");
				p=p.replace(":3", "");
				p=p.replace(":", "");
				

				if(p.contains("of|ending=")){
					cadena = new StringBuilder();
					agregar=false;
					if(p.contains("pers=1")){
						cadena.append("first-person ");
					}
					if(p.contains("pers=2")){
						cadena.append("second-person ");	
					}
					if(p.contains("pers=3")){
						cadena.append("Third-person ");
					}
					if(p.contains("number=singular")){
						cadena.append("singular ");
						p=p.replace("number=singular|", "¬");
						String verbo = p.substring(p.indexOf("¬")+1);
						cadena.append("verb "+verbo);
					}
					if(p.contains("number=plural")){
						cadena.append("plural ");
						p=p.replace("number=plural|", "¬");
						String verbo = p.substring(p.indexOf("¬")+1);
						cadena.append("verb "+verbo);
					}
				}

				if(p.contains("|")){
//					p=p.substring(p.indexOf("|")+1);
					agregar=false;
				}

				p=p.replace("ucf", palabra);
			

				if(agregar){
					frase.append(p+" ");
//					log.debug("Palabra tratada: "+p);
				}else{
					p=p.substring(p.indexOf("|")+1);
					frase.append(p+" ");
//					log.debug("Palabra tratada: "+p);
				}
		}

//		log.info(frase.toString());
		if(cadena!=null) return cadena.toString().trim();
		return frase.toString().trim();
	}

	public void fillVO() throws NumberFormatException, DAOException {
		log.info("Ahora toca rellenar los VO");
		idiomaVO = new IdiomaVO();
		definicionVO=new DefinicionVO();
		palabraVO=new PalabraVO();

		try{
//			palabra_id=new Integer(sequenceGeneratorDAO.generateId("palabra"));
			//Id de palabra, se saca de la taba sequence
//			palabraVO.setPalabra_id(palabra_id);
//			idiomaVO.setPalabra_id(palabra_id);
//			definicionVO.setPalabra_id(palabra_id);
		}catch (Exception e) {
			log.error("No se puede obtener el id de sequenceGeneratorDAO");
		}
		
		
		idiomaVO.setIdioma(idioma_palabra);
		idiomaVO.setNombre(palabra);
		idiomaVO.setVisitas(1);
		idiomaVO.setContador_wiki(1);
		String forvo=new GetPronun(palabra, idioma_palabra).getPhonetic();
		if(forvo!=null)idiomaVO.setPronunciacion("["+forvo+"]");
		else if(pronunciacion!=null)idiomaVO.setPronunciacion(pronunciacion);
		log.info("LA PRONUNCIACIÓN: "+idiomaVO.getPronunciacion());
		if(!otro&&verbo==null)idiomaVO.setGenero(genero);
		idiomaVO.setPlural(plural);
		idiomaVO.setAudio(audio);
		if(!sust&&!otro)idiomaVO.setVerbo(verbo);
		idiomaVO.setSustantivo(sust);
		idiomaVO.setOtro(otro);
		//			idiomaVO.setCompleto(completo));
		//			idiomaVO.setAutoactualizado(autoactualizado);
		idiomaVO.setEquivalente_es(inES);
		idiomaVO.setEquivalente_en(inEN);
		idiomaVO.setEquivalente_de(inDE);
		idiomaVO.setEquivalente_fr(inFR);
		//			idiomaVO.setConjugacion_verbo(conjugacion_verbo);
		
//					idiomaVO.setFecha_completo(fecha_completo);
		codigo_audio=new GetAudio(palabra, idioma_palabra).getPathogg();
		if(codigo_audio==null)codigo_audio="http://translate.google.com/translate_tts?tl="+idioma_palabra+"&q="+palabra;
		
		idiomaVO.setCod_audio(codigo_audio);

		int nIdiomaPalabra=0;
		if(idioma_palabra.equals("en")){
			nIdiomaPalabra=1;
		}
		if(idioma_palabra.equals("es")){
			nIdiomaPalabra=2;
		}
		if(idioma_palabra.equals("de")){
			nIdiomaPalabra=3;
		}
		if(idioma_palabra.equals("fr")){
			nIdiomaPalabra=4;
		}
		
		int nIdiomaWiki=0;
		if(idioma_wiki.equals("en")){
			nIdiomaWiki=1;
		}
		if(idioma_wiki.equals("es")){
			nIdiomaWiki=2;
		}
		if(idioma_wiki.equals("de")){
			nIdiomaWiki=3;
		}
		if(idioma_wiki.equals("fr")){
			nIdiomaWiki=4;
		}
		
		definicionVO.setIdioma_origen(nIdiomaPalabra);
		definicionVO.setIdioma_destino(nIdiomaWiki);
		
		
		//PARA ESPAÑOL
		if(idioma_wiki.equals("es")){
			if(significado1!=null)definicionVO.setDefinicion_1((String)significado1.getValor());
			if(significado2!=null)definicionVO.setDefinicion_2((String)significado2.getValor());
			if(significado3!=null)definicionVO.setDefinicion_3((String)significado3.getValor());
			definicionVO.setEjemplo_1(ejemplo1);
			definicionVO.setEjemplo_2(ejemplo2);
			definicionVO.setEjemplo_3(ejemplo3);
		}else{
//			log.info("Esto se va a rellenar: ");
//			if(significado1!=null)log.debug(significado1.getClave());
//			if(significado2!=null)log.debug(significado2.getClave());
//			if(significado3!=null)log.debug(significado3.getClave());
//			if(significado1!=null)log.debug(significado1.getValor());
//			if(significado2!=null)log.debug(significado2.getValor());
//			if(significado3!=null)log.debug(significado3.getValor());
//			
			if(significado1!=null)definicionVO.setDefinicion_1((String)significado1.getClave());
			if(significado2!=null)definicionVO.setDefinicion_2((String)significado2.getClave());
			if(significado3!=null)definicionVO.setDefinicion_3((String)significado3.getClave());
			if(significado1!=null)definicionVO.setEjemplo_1((String)significado1.getValor());
			if(significado2!=null)definicionVO.setEjemplo_2((String)significado2.getValor());
			if(significado3!=null)definicionVO.setEjemplo_3((String)significado3.getValor());
		
			
		}
		
		//PARA INGLES
		
		
		//			definicionVO.setCompleto(completo);
//					definicionVO.setAuto_actualizado(auto_actualizado);
		
		
		
		definicionVO.setVisitas(1);
		definicionVO.setContador_wiki(1);
		definicionVO.setInfo_direccion("http://"+idioma_wiki+".wiktionary.org/wiki/"+palabra);

		
	}

	public IdiomaVO getIdiomaVO() {
		return idiomaVO;
	}

	public void setIdiomaVO(IdiomaVO idiomaVO) {
		this.idiomaVO = idiomaVO;
	}
	
	public DefinicionVO getDefinicionVO() {
		return definicionVO;
	}

	public PalabraVO getPalabraVO() {
		return palabraVO;
	}

//	public ImagenVO[] getImagenes() {
//		return imagenes;
//	}
	
	public static void main(String[] args) {
		palabra="coche";
		String ejemplo = processEjemplo(":** Ya sabes que no tengo '''coche'''. ");
	
		System.out.println(ejemplo);
	}
}
